#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpServer = nullptr;
    tcpSocket = nullptr;

    setWindowTitle(QString("服务器:8888"));

    //监听套接字，指定父对象，让其自动回收空间
    tcpServer = new QTcpServer(this);

    //绑定和监听  端口号：8888
    tcpServer->listen(QHostAddress::Any,8888);

    //如果成功连接，QTcpServer会触发newConnection信号
    connect(tcpServer,&QTcpServer::newConnection,
            [=]()
            {
                //取出来自客户端的QTcpSocket
                tcpSocket = tcpServer->nextPendingConnection();

                //获取对方的ip和端口
                QString  ip = tcpSocket->peerAddress().toString();
                quint16  port = tcpSocket->peerPort();

                //组包
                QString temp = QString("[%1:%2]:成功连接客户端！").arg(ip).arg(port);
                ui->textEditRead->setText(temp);

                //服务器给客服端发数据，如果数据成功发送，那么客户端会触发readyRead信号
                connect(tcpSocket,&QTcpSocket::readyRead,
                        [=]()
                        {
                            //从通信套接字中取出内容
                            QByteArray array = tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );

    //连接断开时的处理
    connect(tcpSocket,&QTcpSocket::disconnected,
            [=]()
            {
                ui->textEditRead->append("与服务器断开连接！");
            }
            );
}

Widget::~Widget()
{
    delete ui;
}

//给客户端发送数据
void Widget::on_ButtonSend_clicked()
{
    //先判断
    if(tcpSocket == nullptr)
    {
        return ;
    }
    //获取编辑区的内容
    QString str = ui->textEditWrite->toPlainText();

    //给对方发送数据，使用套接字是tcpSocket
    //因为write() 函数的参数是char*,所以要转换类型
    //QString -> QByteArray -> char*
    tcpSocket->write(str.toUtf8().data());

}

//和客户端断开连接
void Widget::on_ButtonClose_clicked()
{
    //先判断
    if(tcpSocket == nullptr)
    {
        return ;
    }

    // 弹出确认对话框，询问用户是否断开连接
    QMessageBox::StandardButton userChose ;
    userChose = QMessageBox::question
    (
        this,                 // 父窗口（对话框居中显示在当前窗口上）
        "断开连接确认",        // 对话框标题
        "确定要断开与客户端的连接吗？",  // 提示内容
        QMessageBox::Yes | QMessageBox::No  // 显示“是”和“否”两个按钮
    );

    if(userChose == QMessageBox::Yes)
    {
        //主动和客户端断开连接
        tcpSocket->disconnectFromHost();
        //关闭
        tcpSocket->close();
        //通信套接字指针置空
        tcpSocket = nullptr;
    }

}

